package com.biqee.framework.context;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.biqee.model.db.BqUser;
import com.biqee.model.db.UserVersion;

/**
 * 用于当前请求的存放用户信息的上下文环境
 * 
 * @author guotao.tangt
 *
 */
public class RequestContext {
	
	@SuppressWarnings("rawtypes")
	private static final ThreadLocal context = new ThreadLocal() {
		protected synchronized Object initialValue() {
			return new HashMap<String, Object>();
		}
	};

    @SuppressWarnings("unchecked")
	private static Map<String, Object> getContext() {
        return (Map<String, Object>) context.get();
    }

    /**
     * 清理上下文数据，每次请求结束后需要调用本方法进行数据清理
     * 请注意，本方法仅在RequestContextIntercept 中调用，其他时刻请勿调用
     */
    public static void clear() {
        getContext().clear();
    }
    
    /*
     * 注意 set 和 get 设计为私有方法
     * 如果需要设置或者读取属性必须在本工具类中指定对应的共有方法，并调用这两个私有方法。
     * 这样防止系统中任意调用set方法而不知道都set了什么信息
     */
    private static void set(String key, Object value) {
        getContext().put(key, value);
    }

    private static Object get(String key) {
        return getContext().get(key);
    }

    private static final String USER_PROPERTY_NAME = "bqUser";
    public static void setUser(BqUser bqUser) {
    	set(USER_PROPERTY_NAME, bqUser);
    }
    
    public static BqUser getUser() {
    	return (BqUser)get(USER_PROPERTY_NAME);
    }
    
    private static final String VERSION_ID_PROPERTY_NAME = "versionIds";
    public static void setUserVersions(List<UserVersion> userVersions) {
    	set(VERSION_ID_PROPERTY_NAME, userVersions);
    }
    
    @SuppressWarnings("unchecked")
	public static List<UserVersion> getUserVersions() {
    	return (List<UserVersion>)get(VERSION_ID_PROPERTY_NAME);
    }
    
}
